package com.example.manager;

import cn.hutool.core.util.BooleanUtil;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

import static com.example.common.RedisContants.LOCK_SHOP_TTL;

/**
 * 使用`@Component`将类标识为一个bean,然后在其他类中直接进行注入，这种方式比较便捷
 * 但灵活性和扩展性较低，也可以避免循环依赖
 * 分布式锁管理器基础版
 */
@Component
public class RedisLockManager {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 分布式锁——创建锁
     *
     * @param key
     * @return
     */
    public boolean tryLock(String key) {
        Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", LOCK_SHOP_TTL, TimeUnit.SECONDS);
        return BooleanUtil.isTrue(flag);
    }

    /**
     * 分布式锁——释放锁
     *
     * @param key
     */
    public void unLock(String key) {
        stringRedisTemplate.delete(key);
    }
}
